libobs_wrapper\data\properties\types/
number.rs1use getters0::Getters;
2
3use crate::data::properties::ObsNumberType;
4
5#[derive(Debug, Getters, Clone)]
6#[skip_new]
7pub struct ObsNumberProperty<T>
8where
9 T: Clone + Copy + std::fmt::Debug,
10{
11 name: String,
12 description: Option<String>,
13 min: T,
14 max: T,
15 step: T,
16 suffix: String,
17 number_type: ObsNumberType,
18}
19
20macro_rules! impl_from_property {
21 ($n_type: ident, $obs_number_name: ident) => {
22 paste::paste! {
23 impl From<super::PropertyCreationInfo> for ObsNumberProperty<[<$n_type>]> {
24 fn from(
25 super::PropertyCreationInfo {
26 name,
27 description,
28 pointer,
29 }: super::PropertyCreationInfo,
30 ) -> Self {
31 use crate::data::properties::ObsNumberType;
32 use num_traits::FromPrimitive;
33
34 let min = unsafe { libobs::[<obs_property_ $obs_number_name _min>](pointer) };
35 let max = unsafe { libobs::[<obs_property_ $obs_number_name _max>](pointer) };
36 let step = unsafe { libobs::[<obs_property_ $obs_number_name _step>](pointer)};
37
38 let suffix = unsafe { libobs::[<obs_property_ $obs_number_name _suffix>](pointer) };
39 let suffix = if suffix.is_null() {
40 String::new()
41 } else {
42 let suffix = unsafe { std::ffi::CStr::from_ptr(suffix) };
43 let suffix = suffix.to_str().unwrap_or_default();
44 suffix.to_string()
45 };
46
47 let number_type = unsafe { libobs::[<obs_property_ $obs_number_name _type >](pointer) };
48 let number_type = ObsNumberType::from_i32(number_type);
49 if number_type.is_none() {
50 panic!("Invalid number type got none");
51 }
52
53 return ObsNumberProperty {
54 name,
55 description,
56 min,
57 max,
58 step,
59 suffix,
60 number_type: number_type.unwrap(),
61 };
62 }
63 }
64 }
65 };
66}
67
68impl_from_property!(i32, int);
69impl_from_property!(f64, float);